package com.qz.recursion;

import java.sql.SQLOutput;

/**
 * @Description 迷宫
 * @Author Flag
 * @Date: 2021/7/25 20:11
 * @Version: 1.0
 **/
public class MazeDome {
    public static void main(String[] args) {

        int[][] init = init(8, 7);
        show(init);

        System.out.println();
        setWay(init,1,1);
        show(init);
    }


    /**
     * 初始化的方法
     * @param row 行
     * @param column 列
     * @return
     */
    public static int[][] init(int row,int column){
        //创建一个二维数组
        int [][] map = new int[row][column];
        //使用1表示墙
        //把上下全部值为1
        for (int i = 0; i < column; i++) {
            map[0][i] = 1;
            map[row-1][i] = 1;
        }
        //把左右全部制成1
        for (int i = 0; i < row; i++) {
            map[i][0] = 1;
            map[i][column-1] = 1;
        }

        map[3][1] = 1;
        map[3][2] = 1;

        System.out.println(map.length);
        return map;
    }

    /**
     * 展示数组
     * @param map
     */
    public static void show(int[][] map){
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j <map[i].length; j++) {
                System.out.print(map[i][j]+" ");

            }
            System.out.println();
        }
    }

    //使用递归回溯，来给小球找路

    /**
     * 使用递归回溯来给小球找路
     * 说明
     * 1.map表示地图
     * 2.i,j表示从地图的哪个位置出发(1,1)
     * 3.如果小球能到map[6][5]位置，说明通路已经找到
     * 4.约定：当map[i][j]为0，表示该点没有走过，当为1表示墙，2表示通路可以走，3表示该点已经走过，但是走不通
     * 5.在走迷宫时，需要定一个策略，下，右，上，左，如果该店走不通，在回溯
     * @param map 表示地图
     * @param i 从地图的哪个位置出发
     * @param j
     * @return
     */
    public static boolean setWay(int [][] map,int i,int j){
        if (map[6][5] == 2 ){
            //通路已经找到
            return true;
        } else {
            //如果当前这个点还没有走过
            if(map[i][j] ==0){
                //如果当前这个点没有走过，下 右 上 左
                //假定是能走通的
                map[i][j] = 2;
                if(setWay(map,i+1,j)){
                    //向下走
                    return true;
                } else if(setWay(map,i,j+1)){
                    //向右走
                    return true;
                } else if(setWay(map,i-1,j)){
                    //向上走
                    return true;
                } else if(setWay(map,i,j-1)){
                    //想左走
                    return true;
                } else {
                    //说明该点是走不通，是死路
                    map[i][j] = 3;
                    return false;
                }
            } else {
                //如果map[i][j]!=0,可能是1，2，3
                return false;
            }
        }
    }
}
